<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
<title>statuschecker.py</title>
<style type="text/css">

/* Robot Framework User Guide Style Sheet

   This stylesheet contains styles from restructuredText's default 
   'html4css1.css' and after that modifications needed for Robot Framework User
   Guide. These styles are added into the same file against suggestions at 
   reST's stylesheet  howto mentioned below, because we want to be able to 
   embed all styles into the created HTML file. Everything before 'Robot 
   Framework User Guide Modifications' text is from 'html4css1.css' without 
   any changes so that part can still be changed easily.
*/


/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin: 0 0 0.5em 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left {
  clear: left }

img.align-right {
  clear: right }

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font-family: serif ;
  font-size: 100% }

pre.literal-block, pre.doctest-block {
  margin-left: 2em ;
  margin-right: 2em }

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

ul.auto-toc {
  list-style-type: none }


/* **************************************** *
 * Robot Framework User Guide Modifications * 
 * **************************************** */

/* Tables
   - example, tsv-example: test data examples
   - messages: log message examples
   - tabular: normal tabular information
*/
table.example, table.tsv-example, table.messages, table.tabular {
    border: 1px solid #808080;
    border-collapse: collapse;
    empty-cell: show;
    margin: 0.5em 2em;
}
table.example caption, table.tsv-example caption, table.tabular caption {
    text-align: left;
    padding-bottom: 0.5em;
    font-style: italic;
    margin: 0.5em 2em;
}
table.example th, table.example td, table.tsv-example td {
    border: 1px solid #808080;
    font-family: arial,helvetica,sans-serif;
    height: 1.2em;
    font-size: 0.85em;
}
table.example th {
    padding: 0.1em 1em;
    background: #E0E0E0;
}
table.example td, table.tsv-example td {
    padding: 0.1em 1em 0.1em 0.3em;
}
table.tabular th, table.tabular td {
    border: 1px solid black;
    padding: 0.1em 0.3em;
    height: 1.2em;
    font-size: 0.9em;
}
table.messages {
    border: 1px solid gray;
    font-family: monospace;
    margin: 1em 2em;
    width: 60%;
}
table.messages td {
    vertical-align: top;
    padding: 0.1em 0.2em;
}
table.messages td.time {
    width: 7em;
    letter-spacing: -0.05em;
} 
table.messages td.level {
    width: 5em;
    text-align: center;
}
table.messages td.fail, table.messages td.error {
    color: red;
}
table.messages td.pass {
    color: #009900;
}
table.messages td.warn {
    color: #FFCC00;
}

/* Roles -- these are defined in roles.txt file */

.var {
    background: #f4f4f4;
    font-size: 0.9em;
}
.opt {
    font-style: italic;
}
.prog, .code, .cli {
    background: #f4f4f4;
    font-family: monospace;
}
.msg {
    font-family: monospace;
}
.name {  
    font-style: italic;
}
.path {
    font-style: italic;
}
.misc, .literal {
    background: #f4f4f4;
}


/* Overridden and modified styles */

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
    border: 2px solid gray;
}
pre.literal-block, pre.doctest-block {
    background: #f4f4f4;
}


/* Pygments 

- Styles generated using "HtmlFormatter().get_style_defs('.highlight')"
- Changed only background (f8f8f8 -> f4f4f4) and added margin
- For more details see e.g. http://pygments.org/docs/quickstart/
*/

.highlight  { background: #f4f4f4; margin: 1em 2em; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #808080 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0040D0 } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */

</style>
</head>
<body>
<div class="document" id="statuschecker-py">
<h1 class="title">statuschecker.py</h1>

<!-- Roles to use in text like :rolename:`text`. Styled in userguide.css.
- var    variables
- opt    settings in setting table (e.g. Force Tags), tc/kw tables
         (e.g [Documentation]) and command line options (e.g. - -name)
- prog   program names (e.g. rebot, risto.py)
- code   programming code
- msg    test case status and message, as well as log messages and levels
- name   keyword, library, test case, test suite, etc. names
- cli    command line examples (note that options alone use opt)
- path   file names and paths
- misc   everything else (synonym to ``text``) -->
<p><span class="prog">statuschecker.py</span> is a tool for checking that Robot Framework
test cases have expected statuses and log messages.  It is included in
source distributions and can also be downloaded from
<a class="reference external" href="http://code.google.com/p/robotframework/wiki/TestStatusCheckerTool">http://code.google.com/p/robotframework/wiki/TestStatusCheckerTool</a>.</p>
<div class="section" id="synopsis">
<h1>Synopsis</h1>
<pre class="literal-block">
statuschecker.py infile [outfile]
</pre>
</div>
<div class="section" id="description">
<h1>Description</h1>
<p>This tool processes Robot Framework output XML files and checks that
test case statuses and messages are as expected. The main use case is
post-processing output files got when testing Robot Framework test
libraries using Robot Framework itself.</p>
<p>If an output file is not given, the input file is considered to be
also an output file and it is edited in place.</p>
<div class="section" id="defining-expected-test-status">
<h2>Defining expected test status</h2>
<p>By default, all test cases are expected to <span class="msg">PASS</span> and have no
message. Changing the expected status to <span class="msg">FAIL</span> is done by having
the word <span class="msg">FAIL</span> (in uppercase) somewhere in the test case
documentation. The expected error message must then be given after
<span class="msg">FAIL</span>.</p>
<p>The error message can also be specified as a regular expression by
prefixing it with <span class="msg">REGEXP:</span>. The specified regular expression
must match the error message fully. Having spaces between the status,
the message or the possible regular expression prefix is optional.</p>
<table border="1" class="example docutils">
<caption>Examples</caption>
<colgroup>
<col width="24%" />
<col width="21%" />
<col width="13%" />
<col width="41%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Test Case</th>
<th class="head">Action</th>
<th class="head">Arguments</th>
<th class="head">Arguments</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>Simple Example</td>
<td>[Documentation]</td>
<td>FAIL</td>
<td>Expected error message</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Regexp Example</td>
<td>[Documentation]</td>
<td>FAIL</td>
<td>REGEXP: (IOError|OSError): .*</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="defining-expected-log-messages">
<h2>Defining expected log messages</h2>
<p>The expected keyword log messages can also be defined in the test case
documentation using a syntax such as:</p>
<pre class="literal-block">
LOG x.y:z LEVEL Actual message
</pre>
<p>The part before the colon is the number of the keyword to check. For
example <span class="msg">1</span> means first keyword, <span class="msg">1.2</span> is the second child
keyword of the first keyword, and so on.</p>
<p>The part after the colon denotes the number of the message. For
example <span class="msg">1:2</span> means the second message of the first keyword and
<span class="msg">1.2:3</span> is the third message of the second child keyword of the
first keyword. The message index is optional and defaults to <span class="msg">1</span>.</p>
<p>Message level is specified before the actual message, and it can be
any of the valid log levels in capital letters. If the level is not
given it defaults to <span class="msg">INFO</span>.</p>
<p>This syntax can be used multiple times to test multiple messages.  It
also workstogether with specifying the expected error message with
<span class="msg">FAIL</span>, but it that case <span class="msg">FAIL</span> and the expected error must
be first.</p>
<p>The log message can also be given as a regular expression pattern the
same way as the <a class="reference internal" href="#defining-expected-test-status">expected error message</a>. Finally, to check that a
keyword does not have a certain message, it is possible to use
<span class="msg">NONE</span> in the place of the message.</p>
<table border="1" class="example docutils">
<caption>Examples</caption>
<colgroup>
<col width="24%" />
<col width="21%" />
<col width="13%" />
<col width="41%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Test Case</th>
<th class="head">Action</th>
<th class="head">Arguments</th>
<th class="head">Arguments</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>Simple Example</td>
<td>[Documentation]</td>
<td>LOG 1</td>
<td>Hello, world!</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Nested Keywords</td>
<td>[Documentation]</td>
<td>LOG 2.1</td>
<td>1st child of 2nd kw</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Message Index</td>
<td>[Documentation]</td>
<td>LOG 2:2</td>
<td>2nd msg of 2nd kw</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Nested and Index</td>
<td>[Documentation]</td>
<td>LOG 3.1:2</td>
<td>2nd msg of 3rd kw's 1st child</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Levels 1</td>
<td>[Documentation]</td>
<td>LOG 2</td>
<td>DEBUG Debug level</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Levels 2</td>
<td>[Documentation]</td>
<td>LOG 1.2:3</td>
<td>WARN Warning</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Multiple Messages</td>
<td>[Documentation]</td>
<td>LOG 1</td>
<td>First tested message</td>
</tr>
<tr><td></td>
<td>...</td>
<td>LOG 1.2</td>
<td>Second tested message</td>
</tr>
<tr><td></td>
<td>...</td>
<td>LOG 2.2.1</td>
<td>DEBUG Third tested message</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Status and Log</td>
<td>[Documentation]</td>
<td>FAIL</td>
<td>Expected error message</td>
</tr>
<tr><td></td>
<td>...</td>
<td>LOG 1.2</td>
<td>Expected log message</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>Regexp Message</td>
<td>[Documentation]</td>
<td>LOG 1</td>
<td>REGEXP: (Hello|Hi) world!</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
<tr><td>No Message</td>
<td>[Documentation]</td>
<td>LOG 1:1</td>
<td>Test that we have only 1 msg</td>
</tr>
<tr><td></td>
<td>...</td>
<td>LOG 1:2</td>
<td>NONE</td>
</tr>
<tr><td></td>
<td>Steps</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="footer">
<hr class="footer" />
Generated on: 2008-09-24 16:47 UTC.

</div>
</body>
</html>
